<div id="content">
	<h1>用户角色授权</h1>
	<p class="mg_t_10">
	　　Duolam auth 框架的核心是一个预定义的 用户（user）应用组件 它是一个实现了 <strong>dpUser</strong> 接口的对象。此用户组件代表当前用户的持久性认证信息。我们可以通过 <strong>D::app()->user()</strong> 在任何地方访问它。<br />
	　　使用该用户组件，我们可以通过 <strong>isGuest()</strong> 检查一个用户是否是游客(是否登陆)、可以通过 login() 登陆 和 logout() 注销一个用户。还有许多方法可以检查是否是超级管理员，用户是否激活；或者获取用户的持久性信息等等
	</p>
	<h1>用户身份认证</h1>
	<p class="mg_t_10">
	　　为了验证一个用户，我们定义一个有验证逻辑的身份类。这个身份类实现 dpUserIdentity 接口。<br />
	　　下面给出一个用户身份验证例子：
	</p>
	<pre class="syntax php">&lt;?php
	class UserAuth extends dpUserIdentity
	{
	    public function authenticate()
	    {
	        $record = User::model()->findByAttribute(array('username'=>$this->username));
	        if($record === null)
	       	{
	            $this->errorMsg = '用户不存在';
	            return false;
	        }
	        else if($record->password!==md5($this->password))
	       	{
	            $this->errorMsg = '密码错误';
	            return false;
	        }
	        else
	        {
	            $this->uid = $record->uid;
	            $this->gid = $record->gid;
	            return true;
	        }
	    }
	}
?&gt;</pre>
	<p class="mg_t_10">
	　　作为状态存储的信息（持久性用户信息）将被传递给 <strong>dpUser</strong> 。而后者则把这些信息存放在一个永久存储媒介上（如session）。例如，设置用户的登陆时间信息，我们可以使用 <strong>setState()</strong>，而获取用户的持久性信息，通过 <strong>getState()</strong> 来得到。
	</p>
	<h1>登陆和退出</h1>
	<p class="mg_t_10">
	　　用户组件提供了登陆和退出功能，我们只需要调用他即可，但首先确定用户身份认证操作已完成。
	</p>
	<pre class="syntax php">&lt;?php
	$identity = new UserAuth($_POST['username'],$_POST['password']);
	if($identity->authenticate())
	    D::app()->user()->login($identity);
	else
	    echo $identity->getError();

	// 注销当前用户
	D::app()->user()->logout();
?&gt;</pre>
	<p class="mg_t_10">
	　　由于默认保存信息使用的是 <strong>session</strong>，但如果需要用户关闭浏览器的情况下，下次打开占站点依然处于的登陆状态；我们只需要把属性 <strong>autoLogin</strong> 设置为 <strong>true</strong>，另外通过 <strong>login()</strong> 方法的第二个参数设置有效时间。
	</p>
	<pre class="syntax php">&lt;?php
	$identity = new UserAuth($_POST['username'],$_POST['password']);
	if($identity->authenticate())
	    D::app()->user()->login($identity, 3600*24*7);
?&gt;</pre><br />
	<h1>用户授权</h1>
	<p class="mg_t_10">
	　　在 Duolam 的 RBAC 中，一个基本的概念是 授权项目（authorization item）。一个授权项目就是一个做某件事的许可（例如新帖发布，用户管理）。授权项目可分为 行为（Behavior），角色（Roles），用户或者组（User Or Group）。<br />　　一个角色由若干行为组成，一个用户或者组由若干角色组成， 而一个行为就是一个许可，不可再分。<br />　　例如，我们有一个系统，它有一个 管理员 角色，它由 帖子管理 和 用户管理 行为组成。 用户管理 行为可以包含 创建用户，修改用户 和 删除用户 操作组成。 为保持灵活性，Duolam 还允许角色权限继承。一个用户一旦被赋予一个角色，他就会拥有此角色所代表的权限。 例如，如果我们赋予一个用户 管理员 的角色，他就会拥有管理员的权限，包括 帖子管理 和 用户管理 （以及相应的操作，例如 创建用户）。<br />
	　　但是，用户和组是各自的权限体系，可以交叉，也可以独立。总之，定义授权等级体系总共分为三步：
	</p>
	<pre class="syntax php">&lt;?php
	$auth = D::app()->auth();

	$user_id  = 1;		//用户ID
	$group_id = 1;		//组ID

	/**
	 * 通过用户层面授权用户权限
	 */
	$behavior = $auth->createUserRole($user_id, '普通用户');

	//给用户角色添加行为
	$behavior->createBehavior('用户行为',
		array(
			'control' => 'index',
			'action'  => array(
				'index',
				'list',
				'show'
			)
		)
	);

	/**
	 * 通过组层面授权用户权限
	 */
	$behavior = $auth->createGroupRole('策划');

	//给组角色添加行为
	$behavior->createBehavior('组行为', $group_id, 
		array(
			'control' => 'plan',
			'action'  => array(
				'add',
				'delete',
				'edit',
			)
		)
	);

	//如果没有组的情况下，可以通过 createGroup() 建立组
	$behavior = $auth->createGroup('销售部')->createGroupRole('策划');
?&gt;</pre>
</div>
<script type="text/javascript">
$(function() {
	jQuery.syntax();
});
</script>